package qn.common.service;


import java.util.List;
import java.util.Map;

/**
 * 注意：以下实现的方法内部key和field内部都使用字节实现
 *
 * @author xianyongjie
 */
public interface IRedisCache<T> {


    /**
     * 设置过期时间
     *
     * @param key key
     * @param expireSeconds  过期时间
     * @return int 整型
     */
    public int expire(String key,int expireSeconds);

    /**
     * 获取key对应的value
     *
     * @param key key
     * @return Object
     */
    public Object get(String key);

    /**
     * 获取key对应的value
     * @param key key
     * @return String value
     */
    public String getCacheString(String key);

    /**
     *  获取hash数据类型key，field对应的value
     *
     * @param key key
     * @param field 字段
     * @return Object
     */
    public Object get(String key, String field);

    /**
     * 是否包含key
     *
     * @param key key
     * @return boolean
     */
    public boolean contains(String key);

    /**
     * hash数据类型
     *
     * @param key key
     * @param field field
     * @return boolean
     */
    public boolean contains(String key, String field);

    /**
     * 查看剩余生存时间,原redis命令ttl
     *
     * @param key key
     * @return -1, 如果key没有到期超时,-2, 如果键不存在
     */
    public int ttl(String key);

    /**
     * 对key设置缓存数据
     *
     * @param key key
     * @param value value
     * @param expireSeconds  小于1表示永不超时
     */
    public void put(String key, Object value, int expireSeconds);

    /**
     * 集合类型设置key对应field的单个值
     *
     * @param key key
     * @param field field
     * @param value value
     * @param expireSeconds 少于1表示永不超时（如果field不为空，缓存时间针对field）
     */
    public void put(String key, String field, Object value, int expireSeconds);

    /**
     * 移除key
     *
     * @param key key
     *
     */
    public void remove(String key);

    /**
     * 集合类型移除key对应的field
     *
     * @param key key
     * @param field field
     */
    public void remove(String key, String field);

    /**
     * 增计数器
     *
     * @param key key
     * @param field field
     * @param value value
     * @param expireSeconds 少于1表示永不超时（如果field不为空，缓存时间针对field）
     */
    public void incr(String key, String field, int value, int expireSeconds);

    /**
     * 增计数器
     *
     * @param key key
     * @param value value
     * @param expireSeconds 少于1表示永不超时
     */
    public void incr(String key, int value, int expireSeconds);

    /**
     * redis客户端执行方法，该方法不会抛异常
     *
     * @param callback 回调
     * @return Object
     */
    public Object execute(Callback<T> callback);

    /**
     * redis客户端执行方法
     *
     * @param callback 回调
     * @return Object
     */
    public Object executeThrowExcepton(Callback<T> callback)throws Exception;

    /**
     * @param <T> 泛型
     * @author xianyongjie
     */
    public interface Callback<T> {
        /**
         * @param jedis redis实例
         * @return  Object
         */
        public Object process(T jedis)throws Exception;
    }

}